home *** CD-ROM | disk | FTP | other *** search
- # Automatic Python regression test.
- #
- # Some essential parts of the Python interpreter are tested by the module
- # 'testall'. (Despite its name, it doesn't test everything -- that would
- # be a truly Herculean task!) When a test fails, 'testall' raises an
- # exception. When all tests succeed, it produces quite a lot of output.
- #
- # For a normal regression test, this output is never looked at unless
- # something goes wrong. Thus, it would be wise to suppress the output
- # normally. This module does that, but it doesn't just throw the output
- # from 'testall' away -- it compares it with the output from a previous
- # run. If a difference is noticed it raises an exception; if all is well,
- # it prints nothing except 'All tests OK.' at the very end.
- #
- # The output from a previous run is supposed to be in a file 'testall.out'
- # somewhere on the search path for modules (sys.path, initialized from
- # $PYTHONPATH plus some default places).
- #
- # Of course, if the normal output of the tests is changed because the
- # tests have been changed (rather than a test producing the wrong output),
- # 'autotest' will fail as well. In this case, run 'testall' manually
- # and direct its output to 'testall.out'.
- #
- # The comparison uses (and demonstrates!) a rather new Python feature:
- # program output that normally goes to stdout (by 'print' statements
- # or by writing directly to sys.stdout) can be redirected to an
- # arbitrary class instance as long as it has a 'write' method.
-
- import os
- import sys
-
- # Function to find a file somewhere on sys.path
- def findfile(filename):
- for dirname in sys.path:
- fullname = os.path.join(dirname, filename)
- if os.path.exists(fullname):
- return fullname
- return filename # Will cause exception later
-
- # Exception raised when the test failed (not the same as in test_support)
- TestFailed = 'autotest.TestFailed'
-
- # Class substituted for sys.stdout, to compare it with the given file
- class Compare:
- def __init__(self, filename):
- self.fp = open(filename, 'r')
- def write(self, data):
- expected = self.fp.read(len(data))
- if data <> expected:
- raise TestFailed, \
- 'Writing: '+`data`+', expected: '+`expected`
- def close(self):
- self.fp.close()
-
- # The main program
- def main():
- import sys
- filename = findfile('testall.out')
- real_stdout = sys.stdout
- try:
- sys.stdout = Compare(filename)
- import testall
- finally:
- sys.stdout = real_stdout
- print 'All tests OK.'
-
- main()
-